﻿//using System;
//using System.Collections.Generic;
//using System.ComponentModel;
//using System.Drawing;
//using System.Text;
//using System.Windows.Forms;
//using InkFx.WinControl.Core;
//using InkFx.WinControl.Utils;
//using DA = InkFx.WinControl.XIDEAlignment;
//using DTGS = InkFx.WinControl.XIDEGroupState;

//namespace InkFx.WinControl
//{
//    /// <summary>
//    /// 为可用作其他控件的容器的控件提供焦点管理功能。
//    /// </summary>
//    [ToolboxItem(false)]
//    public class XIDESplitControl : SplitControl
//    {
//        /// <summary>
//        /// 构造函数
//        /// </summary>
//        /// <param name="idePanel">Type: XIDEPanel</param>
//        [Obsolete("不建议手动调用 XIDESplitControl 的构造函数", false)]
//        public XIDESplitControl(XIDEPanel idePanel)
//        {
//            this.Name = XIDEPanel.NewName("ideSplitCtrl");
//            this.m_IDEPanel = idePanel;
//            if (idePanel != null) idePanel.RegSplitControl(this);

//            ////这两行代码正式运行时需要取消
//            //this.Panel1.BackColor = GUIHelper.GetRandomColor(100);
//            //this.Panel2.BackColor = GUIHelper.GetRandomColor(100);

//            base.SplitterWidth = XIDEPanel.SPLIT_SIZE;
//            base.SplitterColor = Color.Transparent;
//            base.Panel1MinSize = base.Panel2MinSize = XIDEPanel.SPLIT_PANEL_MIN_SIZE;
//            base.TLButtonVisible = this.BRButtonVisible = false;

//            Tools.LogDebug(string.Format("XIDESplitControl 创建: Name='{0}' Type='{1}' ", this.Name, Tools.GetKnowFullTypeName(this.GetType())));
//        }


//        #region  创建 或 销毁 XIDESplitControl

//        /// <summary>
//        /// 将 group1 与 group2 合并到一个 XIDESplitControl 中
//        /// <para>group1 必须是已经存在且显示的 XIDEGroup</para>
//        /// <para>group2 是即将加入的 XIDEGroup (一般 group2 正处于 浮动拖拽 的状态)</para>
//        /// <para>align 是 group2 相对 group1 的方位</para>
//        /// </summary>
//        /// <param name="group1">已经存在且显示的 XIDEGroup</param>
//        /// <param name="group2">即将加入的 XIDEGroup (一般 group2 正处于 浮动拖拽 的状态)</param>
//        /// <param name="align">group2 相对 group1 的方位</param>
//        /// <returns>如果融合成功 则返回 融合后的 XIDESplitControl</returns>
//        public static XIDESplitControl DoSplit(XIDEGroup group1, XIDEGroup group2, DA align)
//        {
//            if (group1 == null) throw new ArgumentNullException("group1");
//            if (group1.Parent == null) throw new ArgumentNullException("group1.Parent");
//            if (group1.IDEPanel == null) throw new ArgumentNullException("group1.IDEPanel");
//            if (group2 == null) throw new ArgumentNullException("group2");

//            return DoSplitCore(group1.IDEPanel, group1, group2, align);
//        }
//        /// <summary>
//        /// 将 split1 与 group2 合并到一个 XIDESplitControl 中
//        /// <para>split1 必须是已经存在且显示的 XIDEGroup</para>
//        /// <para>group2 是即将加入的 XIDEGroup (一般 group2 正处于 浮动拖拽 的状态)</para>
//        /// <para>align 是 group2 相对 split1 的方位</para>
//        /// </summary>
//        /// <param name="split1">已经存在且显示的 XIDEGroup</param>
//        /// <param name="group2">即将加入的 XIDEGroup (一般 group2 正处于 浮动拖拽 的状态)</param>
//        /// <param name="align">group2 相对 split1 的方位</param>
//        /// <returns>如果融合成功 则返回 融合后的 XIDESplitControl</returns>
//        public static XIDESplitControl DoSplit(XIDESplitControl split1, XIDEGroup group2, DA align)
//        {
//            if (split1 == null) throw new ArgumentNullException("split1");
//            if (split1.Parent == null) throw new ArgumentNullException("split1.Parent");
//            if (split1.IDEPanel == null) throw new ArgumentNullException("split1.IDEPanel");
//            if (group2 == null) throw new ArgumentNullException("group2");

//            return DoSplitCore(split1.IDEPanel, split1, group2, align);
//        }
//        /// <summary>
//        /// 将 center1 与 group2 合并到一个 XIDESplitControl 中
//        /// <para>center1 必须是已经存在且显示的 XIDEGroup</para>
//        /// <para>group2 是即将加入的 XIDEGroup (一般 group2 正处于 浮动拖拽 的状态)</para>
//        /// <para>align 是 group2 相对 center1 的方位</para>
//        /// </summary>
//        /// <param name="center1">已经存在且显示的 XIDEGroup</param>
//        /// <param name="group2">即将加入的 XIDEGroup (一般 group2 正处于 浮动拖拽 的状态)</param>
//        /// <param name="align">group2 相对 center1 的方位</param>
//        /// <returns>如果融合成功 则返回 融合后的 XIDESplitControl</returns>
//        public static XIDESplitControl DoSplit(XIDEPanelCenter center1, XIDEGroup group2, DA align)
//        {
//            if (center1 == null) throw new ArgumentNullException("center1");
//            if (center1.Parent == null) throw new ArgumentNullException("center1.Parent");
//            if (center1.IDEPanel == null) throw new ArgumentNullException("center1.IDEPanel");
//            if (group2 == null) throw new ArgumentNullException("group2");

//            return DoSplitCore(center1.IDEPanel, center1, group2, align);
//        }

//        /// <summary>
//        /// 将 control 与 group2 合并到一个 XIDESplitControl 中
//        /// <para>control 必须是已经存在且显示的 XIDEGroup 或 XIDESplitControl 或 XIDEPanelCenter</para>
//        /// <para>group2 是即将加入的 XIDEGroup (一般 group2 正处于 浮动拖拽 的状态)</para>
//        /// <para>align 是 group2 相对 control 的方位</para>
//        /// </summary>
//        /// <param name="idePanel">所属的 XIDEPanel 面板</param>
//        /// <param name="control">已经存在且显示的 XIDEGroup 或 XIDESplitControl 或 XIDEPanelCenter</param>
//        /// <param name="group2">即将加入的 XIDEGroup (一般 group2 正处于 浮动拖拽 的状态)</param>
//        /// <param name="align">group2 相对 control 的方位</param>
//        /// <returns>如果融合成功 则返回 融合后的 XIDESplitControl</returns>
//        protected static XIDESplitControl DoSplitCore(XIDEPanel idePanel, System.Windows.Forms.Control control, XIDEGroup group2, DA align)
//        {
//            if (idePanel == null) throw new ArgumentNullException("idePanel");
//            if (control == null) throw new ArgumentNullException("control");
//            if (control.Parent == null) throw new ArgumentNullException("control.Parent");
//            if (group2 == null) throw new ArgumentNullException("group2");
//            //if (group2.Parent == null) throw new ArgumentNullException("group2.Parent");
//            //if (group2.IDEPanel == null) throw new ArgumentNullException("group2.IDEPanel");
//            if (!(control is XIDEGroup) && !(control is XIDESplitControl) && !(control is XIDEPanelCenter)) throw new ArgumentException("control 必须是 XIDEGroup | XIDESplitControl | XIDEPanelCenter 三种类型的一种", "control");



//            var parent = control.Parent;

//            #region  如果 group1 和 group2 已经是 目标状态, 则不再执行任何逻辑




//            #endregion


//            #region  释放 group2 的额外资源

//            //group2.ReleaseLogic();
//            if (control is XIDEGroup) { var group1 = (XIDEGroup)control; group2.m_Alignment = group1.m_Alignment; }
            
//            #endregion


//            #region  执行 拆分逻辑


//            var split = new XIDESplitControl(idePanel);
//            idePanel.TransLayout(() =>
//            {
//                System.Windows.Forms.Control ctrl1 = control;
//                System.Windows.Forms.Control ctrl2 = group2;
//                split.IsHorizontal = (align == DA.Top || align == DA.Bottom);

//                if (align == DA.Right || align == DA.Bottom) { var temp = ctrl2; ctrl2 = ctrl1; ctrl1 = temp; }

//                //ctrl1.Parent = null;
//                //split.Dock = DockStyle.Fill; //2020-07-27
//                split.Bounds = parent.Bounds;
//                split.Parent = parent;
//                split.SetChild(ctrl2, ctrl1);
//                //ctrl2.Parent = split.Panel1;
//                //ctrl1.Parent = split.Panel2;
//                group2.m_State = DTGS.Expand;
//                if (parent is XIDEPanelCenter) { split.Dock = DockStyle.Fill; }
//            });
//            return split;



//            #endregion
//        }

//        /// <summary>
//        /// 如果当前 XIDESplitControl 中, 仅有 Panel1 或 Panel2 中包含控件, 则销毁当前 XIDESplitControl, 并将剩余控件转移到 父级中
//        /// <para>返回参数 hide1 hide2 表示面板 Panel1 Panel1 是否应该隐藏</para>
//        /// </summary>
//        /// <param name="hide1">Panel1 是否应该处于 折叠状态</param>
//        /// <param name="hide2">Panel2 是否应该处于 折叠状态</param>
//        /// <returns>如果销毁成功则返回 true, 否则返回 false</returns>
//        public virtual bool TryDestroy(out bool hide1, out bool hide2)
//        {
//            //Console.WriteLine("TryDestroy: " + this.ToString());

//            hide1 = hide2 = true;
//            var idePanel = this.IDEPanel;

//            var ctrl1 = idePanel == null ? null : idePanel.FindGroupOrSplitOrCenter(this.Panel1, out hide1);
//            var ctrl2 = idePanel == null ? null : idePanel.FindGroupOrSplitOrCenter(this.Panel2, out hide2);

//            if (ctrl1 == null && ctrl2 == null)
//            {
//                #region  完全销毁

//                this.Parent = null;
//                this.Dispose();
//                return true;

//                #endregion
//            }
//            if ((ctrl1 == null && ctrl2 != null) || (ctrl2 == null && ctrl1 != null))
//            {
//                #region  执行合并

//                var parent = this.Parent;
//                //if (parent != null) parent.SuspendLayout();
//                var ctrl = ctrl1 ?? ctrl2;
//                ctrl.Bounds = parent.Bounds;
//                ctrl.Parent = parent; //(parent is IDEPanel) ? ((IDEPanel) parent).CenterPanel : parent;

//                this.Parent = null;
//                this.Dispose();
//                //if (parent != null) parent.ResumeLayout();
//                return true;

//                #endregion
//            }

//            return false;
//        }

//        #endregion



//        #region  字 段 属 性

//        /// <summary>
//        /// 内部字段
//        /// </summary>
//        protected InkFx.WinControl.XIDEPanel m_IDEPanel;

//        /// <summary>
//        /// 
//        /// </summary>
//        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Always)]
//        public virtual InkFx.WinControl.XIDEPanel IDEPanel
//        {
//            get { return m_IDEPanel; }
//        }

//        /// <summary>
//        /// 获取或设置控件的父容器。
//        /// </summary>
//        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Always)]
//        public virtual new System.Windows.Forms.Control Parent
//        {
//            get { return base.Parent; }
//            set
//            {
//                if (base.Parent == value) return;

//                var old = base.Parent;
//                if (old != null) old.Controls.Remove(this);
//                if (old != null && old.Controls.Contains(this))
//                    throw new Exception(string.Format("当代码设置 Parent 移除 IDESplitControl 后, Parent 的 Controls 依然包含此 IDESplitControl (这可能是 .Net 底层 WinForm 的 BUG) : \r\n    Parent = {0} \r\n    IDESplitControl = {1}", old, this));

//                base.Parent = value;
//            }
//        }
//        /// <summary>
//        /// 
//        /// </summary>
//        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Always)]
//        public virtual InkFx.WinControl.XIDESplitPanel SplitPanel
//        {
//            get
//            {
//                var splitPanel = base.Parent as InkFx.WinControl.XIDESplitPanel;
//                return splitPanel;
//            }
//        }


//        /// <summary>
//        /// 
//        /// </summary>
//        public new XIDESplitPanel Panel1
//        {
//            get
//            {
//                var panel = base.m_Panel1 as XIDESplitPanel;
//                if (panel != null) return panel;
//                this.InitPanel12();
//                return (XIDESplitPanel)base.m_Panel1;
//            }
//        }
//        /// <summary>
//        /// 
//        /// </summary>
//        public new XIDESplitPanel Panel2
//        {
//            get
//            {
//                var panel = base.m_Panel2 as XIDESplitPanel;
//                if (panel != null) return panel;
//                this.InitPanel12();
//                return (XIDESplitPanel)base.m_Panel2;
//            }
//        }


//        /// <summary>
//        /// 标识 Panel1 是否应该被折叠 (本属性返回的 只是一个 参考值)
//        /// </summary>
//        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Always)]
//        public virtual bool Panel1Hidden
//        {
//            get
//            {
//                var idePanel = this.IDEPanel;
//                if (idePanel == null) return true;

//                bool hide1;
//                idePanel.FindGroupOrSplitOrCenter(this.Panel1, out hide1);
//                return hide1;
//            }
//        }
//        /// <summary>
//        /// 标识 Panel2 是否应该被折叠 (本属性返回的 只是一个 参考值)
//        /// </summary>
//        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Always)]
//        public virtual bool Panel2Hidden
//        {
//            get
//            {
//                var idePanel = this.IDEPanel;
//                if (idePanel == null) return true;

//                bool hide2;
//                idePanel.FindGroupOrSplitOrCenter(this.Panel2, out hide2);
//                return hide2;
//            }
//        }
//        /// <summary>
//        /// 标识 Panel1 和 Panel2 是否应该都被折叠 (本属性返回的 只是一个 参考值)
//        /// <para>后续实际代码中: 如果本属性返回 true, 则表示当前控件 都应该被 隐藏</para>
//        /// </summary>
//        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Always)]
//        public virtual bool PanelAllHidden
//        {
//            get { return this.Panel1Hidden && this.Panel2Hidden; }
//        }

//        /// <summary>
//        /// 
//        /// </summary>
//        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Always)]
//        protected override bool AlwaysShowSplitter
//        {
//            get { return false; } //当 Panel1 或 Panel2 被折叠时, 完全不显示 分割条区域
//        }


//        #endregion


//        #region  函 数 改 写

//        /// <summary>
//        /// 引发 System.Windows.Forms.Control.SizeChanged 事件。
//        /// </summary>
//        /// <param name="e">包含事件数据的 System.EventArgs。</param>
//        protected override void OnSizeChanged(EventArgs e)
//        {
//            base.OnSizeChanged(e);
//        }
//        /// <summary>
//        /// 引发 System.Windows.Forms.Control.ParentChanged 事件。
//        /// </summary>
//        /// <param name="e">包含事件数据的 System.EventArgs。</param>
//        protected override void OnParentChanged(EventArgs e)
//        {
//            base.OnParentChanged(e);

//            var parent = (this.Disposing || this.IsDisposed) ? null : this.Parent;
//            if (parent == null || parent.Disposing || parent.IsDisposed) return;
//            if (parent is XIDEPanel) return;
//            if (parent is InkFx.WinControl.XIDESplitPanel) return;
//            if (parent is XIDEPanelCenter) return;

//            throw new Exception(string.Format("IDESplitControl 只能是 IDEPanel 或者 SplitterPanel 或者 IDEPanelCenter 的子控件, 而不能是 类型为 '{0}' 的子控件!", parent.GetType().FullName));
//        }



//        /// <summary>
//        /// 重新计算 各种区域边界
//        /// </summary>
//        public override void ResetRect()
//        {
//            var hidden1 = this.Panel1Hidden;
//            var hidden2 = this.Panel2Hidden;

//            #region  设置 折叠状态

//            this.Visible = !(hidden1 && hidden2);
//            base.m_Panel1Collapsed = hidden1; base.m_Panel2Collapsed = hidden2;

//            #endregion


//            #region  设置 内部控件尺寸

//            if (!hidden1)
//            {
//                var bounds1 = new Rectangle(Point.Empty, this.Panel1.Size);
//                var ctrls1 = new List<System.Windows.Forms.Control>();
//                foreach (System.Windows.Forms.Control ctrl in this.Panel1.Controls) { ctrls1.Add(ctrl); }
//                foreach (var ctrl in ctrls1) { /*if (ctrl is ScrollCoverPanel) { continue; } */if (ctrl.Dock != DockStyle.Fill) { ctrl.Bounds = bounds1; } }
//            }
//            if (!hidden2)
//            {
//                var bounds2 = new Rectangle(Point.Empty, this.Panel2.Size);
//                var ctrls2 = new List<System.Windows.Forms.Control>();
//                foreach (System.Windows.Forms.Control ctrl in this.Panel2.Controls) { ctrls2.Add(ctrl); }
//                foreach (var ctrl in ctrls2) { /*if (ctrl is ScrollCoverPanel) { continue; } */if (ctrl.Dock != DockStyle.Fill) { ctrl.Bounds = bounds2; } }
//            }

//            #endregion


//            base.ResetRect();
//        }
//        /// <summary>
//        /// 
//        /// </summary>
//        protected override void InitPanel12()
//        {
//            if (m_Panel1 == null) { m_Panel1 = new XIDESplitPanel(this); this.Controls.Add(m_Panel1); }
//            if (m_Panel2 == null) { m_Panel2 = new XIDESplitPanel(this); this.Controls.Add(m_Panel2); }

//            m_Panel1.BackColorChanged += OnPanel1BackColorChanged;
//            m_Panel1.ForeColorChanged += OnPanel1ForeColorChanged;
//            m_Panel2.BackColorChanged += OnPanel2BackColorChanged;
//            m_Panel2.ForeColorChanged += OnPanel2ForeColorChanged;
//        }
//        /// <summary>
//        /// 
//        /// </summary>
//        /// <returns></returns>
//        protected override Region GetClipRegion()
//        {
//            var clip = Win32API.GetClipRegion(this.IDEPanel);
//            return clip;
//        }


//        /// <summary>
//        /// 返回包含 System.ComponentModel.Component 的名称的 System.String（如果有）。不应重写此方法。
//        /// </summary>
//        /// <returns>包含 System.ComponentModel.Component 的名称的 System.String（如果有）；如果 System.ComponentModel.Component 未命名，则为 null。</returns>
//        public override string ToString()
//        {
//            return "XIDESplitControl: ".PadRight(30) + this.Name;
//        }
//        /// <summary>
//        /// 释放由 System.Windows.Forms.ButtonBase 占用的非托管资源，还可以另外再释放托管资源。
//        /// </summary>
//        /// <param name="disposing">为 true 则释放托管资源和非托管资源；为 false 则仅释放非托管资源。</param>
//        protected override void Dispose(bool disposing)
//        {
//            try
//            {
//                base.Dispose(disposing);
//                Tools.LogDebug(string.Format("XIDESplitControl 销毁: Name='{0}' Text='{1}' Type='{2}' ", this.Name, this.Text, Tools.GetKnowFullTypeName(this.GetType())));
//            }
//            catch (Exception ex) { Tools.LogWarn2(ex, "可忽略的偶发错误"); }
//        }

//        #endregion


//        #region  逻 辑 函 数

//        /// <summary>
//        /// 
//        /// </summary>
//        /// <returns></returns>
//        public XIDEGroup FindGroup()
//        {
//            var group1 = FindGroup(this.Panel1);
//            if (group1 != null) return group1;

//            var group2 = FindGroup(this.Panel2);
//            if (group2 != null) return group2;

//            return null;
//        }
//        private static XIDEGroup FindGroup(InkFx.WinControl.XIDESplitPanel panel)
//        {
//            var ctrls1 = panel.Controls;
//            if (ctrls1.Count <= 0) return null;

//            foreach (var ctrl2 in ctrls1)
//            {
//                if (ctrl2 is XIDEGroup) { return (XIDEGroup)ctrl2; }
//                if (ctrl2 is XIDESplitControl)
//                {
//                    var splitCtrl = (XIDESplitControl)ctrl2;
//                    var group = splitCtrl.FindGroup();
//                    if (group != null) return group;
//                }
//            }
//            return null;
//        }


//        /// <summary>
//        /// 内部字段
//        /// </summary>
//        protected bool m_InitFixedPanel = false;
//        /// <summary>
//        /// 
//        /// </summary>
//        protected internal virtual void InitFixedPanel()
//        {
//            if (m_InitFixedPanel) return;

//            var idePanel = this.IDEPanel;
//            if (idePanel == null) return;
//            if (this.Panel1.Controls.Count <= 0 || this.Panel2.Controls.Count <= 0) return;


//            const int size = XIDEPanel.DEFAULT_GROUP_SIZE;
//            bool center1 = idePanel.ContainsCenterPanel(this.Panel1);
//            bool center2 = idePanel.ContainsCenterPanel(this.Panel2);
//            if (center1 && !center2)
//            {
//                int minDistance = this.Panel1MinSize;
//                this.FixedPanel = FixedPanel.Panel2;
//                this.SplitterDistance = Math.Max(minDistance, (this.IsHorizontal ? this.Height : this.Width) - size);
//            }
//            else if (center2 && !center1)
//            {
//                int maxDistance = this.Width - this.Panel2MinSize;
//                this.FixedPanel = FixedPanel.Panel1;
//                this.SplitterDistance = Math.Min(maxDistance, size);
//            }
//            else
//            {
//                this.FixedPanel = FixedPanel.None;
//                this.SplitterDistance = this.IsHorizontal ? (this.Height - this.SplitterWidth) / 2 : (this.Width - this.SplitterWidth) / 2;
//            }

//            m_InitFixedPanel = true;
//        }


//        /// <summary>
//        /// 
//        /// </summary>
//        /// <param name="ctrl1">Type: System.Windows.Forms.Control</param>
//        /// <param name="ctrl2">Type: System.Windows.Forms.Control</param>
//        public virtual void SetChild(System.Windows.Forms.Control ctrl1, System.Windows.Forms.Control ctrl2)
//        {
//            var idePanel = this.IDEPanel;
//            idePanel.TransLayout(() =>
//            {
//                if (ctrl1 != null) ctrl1.Parent = this.Panel1;
//                if (ctrl2 != null) ctrl2.Parent = this.Panel2;
//            });
//        }


//        //protected override void OnPaint(PaintEventArgs e)
//        //{
//        //    try
//        //    {
//        //        base.OnPaint(e);
//        //        //e.Graphics.Clear(Color.Tomato);
//        //    }
//        //    catch (Exception ex) { Tools.LogWarn2(ex, "改写 XIDESplitControl.OnPaint(PaintEventArgs e) 发生错误"); }
//        //}

//        /// <summary>
//        /// 释放由 System.ComponentModel.Component 使用的所有资源。
//        /// </summary>
//        public virtual new void Dispose()
//        {
//            //Console.WriteLine("XIDESplitControl.Dispose(): " + this.ToString());

//            var ctrls1 = this.Panel1.Controls;
//            var ctrls2 = this.Panel1.Controls;
//            if (ctrls1.Count >= 1) ctrls1.Clear();
//            if (ctrls2.Count >= 1) ctrls2.Clear();

//            this.Parent = null;
//            this.m_IDEPanel = null;
//            base.Dispose();
//        }

//        #endregion
//    }


//    /// <summary>
//    /// 用于对控件集合进行分组。
//    /// </summary>
//    public class XIDESplitPanel : InkFx.WinControl.SplitterPanel
//    {
//        /// <summary>
//        /// 构造函数
//        /// </summary>
//        /// <param name="owner">Type: XIDESplitControl</param>
//        public XIDESplitPanel(XIDESplitControl owner) : base(owner)
//        {
//        }


//        #region  字 段 属 性

//        /// <summary>
//        /// 内部字段
//        /// </summary>
//        protected internal XIDEGroup m_Group;
//        /// <summary>
//        /// 内部字段
//        /// </summary>
//        protected internal XIDESplitControl m_Split;

//        /// <summary>
//        /// 
//        /// </summary>
//        public virtual XIDEGroup Group
//        {
//            get
//            {
//                if (m_Group == null) return null;
//                if (m_Group.IsDisposed) { m_Group = null; return null; }
//                var parent = m_Group.Parent as XIDESplitPanel;
//                if (parent != null && parent != this) { m_Group = null; return null; }
//                return m_Group;
//            }
//            set
//            {
//                if (m_Group != null && value == null) throw new ArgumentNullException("value");
//                m_Group = value;
//                //SetGroup(m_Group, this);
//            }
//        }
//        /// <summary>
//        /// 
//        /// </summary>
//        public virtual XIDESplitControl Split
//        {
//            get
//            {
//                if (m_Split == null) return null;
//                if (m_Split.IsDisposed) { m_Split = null; return null; }
//                var parent = m_Split.Parent as XIDESplitPanel;
//                if (parent != null && parent != this) { m_Split = null; return null; }
//                return m_Split;
//            }
//            set
//            {
//                if (m_Split != null && value == null) throw new ArgumentNullException("value");
//                m_Split = value;
//                //SetSplit(m_Split, this);
//            }
//        }
//        /// <summary>
//        /// 
//        /// </summary>
//        public virtual XIDEPanelCenter Center
//        {
//            get
//            {

//                var owner = this.Owner;
//                var idePanel = owner == null ? null : owner.IDEPanel;
//                if (owner == null || idePanel == null) return null;

//                var center = idePanel.CenterPanel;
//                if (center == null) return null;
//                return (center.Parent == this) ? center : null;
//            }
//        }

//        /// <summary>
//        /// 返回 Group Split Center 三个属性的 有效值
//        /// </summary>
//        public virtual System.Windows.Forms.Control Control
//        {
//            get
//            {
//                var group = Group;
//                if (group != null) return group;

//                var split = Split;
//                if (split != null) return split;

//                var center = Center;
//                if (center != null) return center;

//                return null;
//            }
//        }

//        /// <summary>
//        /// 
//        /// </summary>
//        public new InkFx.WinControl.XIDESplitControl Owner
//        {
//            get { return (XIDESplitControl)this.m_Owner; }
//        }

//        #endregion


//        #region  函 数 改 写

//        /// <summary>
//        /// 引发 System.Windows.Forms.Control.ControlAdded 事件。
//        /// </summary>
//        /// <param name="e">包含事件数据的 System.Windows.Forms.ControlEventArgs。</param>
//        protected override void OnControlAdded(ControlEventArgs e)
//        {
//            base.OnControlAdded(e);

//            var ctrl = e.Control;
//            if (!(ctrl is XIDEGroup) && !(ctrl is XIDESplitControl) && !(ctrl is XIDEPanelCenter))
//                throw new Exception(string.Format("XIDESplitPanel 的子控件, 只能是 IDETabGroup 或 IDESplitControl 或 IDEPanelCenter 类型, 而不能是 类型为 '{0}' 的子控件", e.Control.GetType().FullName));

//            //Console.WriteLine("  + " + e.Control);


//            var owner = this.Owner;
//            var idePanel = owner == null ? null : owner.IDEPanel;
//            if (owner == null || idePanel == null) return;

//            owner.InitFixedPanel();

//            if (ctrl is XIDEGroup) { var ctrl2 = ((XIDEGroup)ctrl); ctrl2.Dock = DockStyle.Fill; this.Group = ctrl2; }
//            else if (ctrl is XIDESplitControl) { var ctrl2 = ((XIDESplitControl)ctrl); ctrl2.Dock = DockStyle.Fill; this.Split = ctrl2; }
//            else if (ctrl is XIDEPanelCenter) { var ctrl2 = ((XIDEPanelCenter)ctrl); ctrl2.Dock = DockStyle.Fill; }
//        }
//        /// <summary>
//        /// 引发 System.Windows.Forms.Control.ControlRemoved 事件。
//        /// </summary>
//        /// <param name="e">包含事件数据的 System.Windows.Forms.ControlEventArgs。</param>
//        protected override void OnControlRemoved(ControlEventArgs e)
//        {
//            base.OnControlRemoved(e);

//            //Console.WriteLine("  - " + e.Control);

//            //var owner = this.Owner;
//            //var idePanel = owner == null ? null : owner.IDEPanel;
//            //if (owner == null || idePanel == null) return;
//            //idePanel.ResetLayout();
//        }

//        #endregion


//        #region  逻 辑 函 数

//        //public void SetChild(Control ctrl)
//        //{
//        //    if (ctrl == null) return;
//        //    if (!(ctrl is XIDEGroup) && !(ctrl is XIDESplitControl) && !(ctrl is XIDEPanelCenter))
//        //        throw new Exception(string.Format("XIDESplitPanel 的子控件, 只能是 IDETabGroup 或 IDESplitControl 或 IDEPanelCenter 类型, 而不能是 类型为 '{0}' 的子控件", ctrl.GetType().FullName));

//        //    ctrl.Parent = this;
//        //    if (ctrl is XIDEGroup) { this.Group = ((XIDEGroup)ctrl); }
//        //    if (ctrl is XIDESplitControl) { this.Split = ((XIDESplitControl)ctrl); }
//        //    //if (ctrl is XIDEPanelCenter) { this.Group = ((XIDEPanelCenter)ctrl); }
//        //}


//        #endregion


//        #region  作 废 代 码

//        //protected static Hash<XIDEGroup, XIDESplitPanel> m_HashGroupPanel = new Hash<XIDEGroup, XIDESplitPanel>();
//        //protected static Hash<XIDESplitControl, XIDESplitPanel> m_HashSplitPanel = new Hash<XIDESplitControl, XIDESplitPanel>();

//        //protected static Hash<XIDEGroup, XIDESplitPanel> HashGroupPanel
//        //{
//        //    get
//        //    {
//        //        var hash = m_HashGroupPanel;

//        //        var list = new List<XIDEGroup>();
//        //        foreach (var key in hash.Keys)
//        //        {
//        //            var value = hash[key];
//        //            if (key == null || value == null || key.Disposing || key.IsDisposed || value.Disposing || value.IsDisposed) list.Add(key);
//        //        }
//        //        //foreach (var key in list)
//        //        //{
//        //        //    var panel2 = hash[key];
//        //        //    var split2 = panel2 == null ? null : panel2.Owner;
//        //        //    if (split2 != null) { panel2.m_Group = null; split2.TryDestroy(); }
//        //        //}
//        //        foreach (var key in list) { hash.Remove(key); }

//        //        return hash;
//        //    }
//        //}
//        //protected static Hash<XIDESplitControl, XIDESplitPanel> HashSplitPanel
//        //{
//        //    get
//        //    {
//        //        var hash = m_HashSplitPanel;

//        //        var list = new List<XIDESplitControl>();
//        //        foreach (var key in hash.Keys)
//        //        {
//        //            var value = hash[key];
//        //            if (key == null || value == null || key.Disposing || key.IsDisposed || value.Disposing || value.IsDisposed) list.Add(key);
//        //        }
//        //        //foreach (var key in list)
//        //        //{
//        //        //    var panel2 = hash[key];
//        //        //    var split2 = panel2 == null ? null : panel2.Owner;
//        //        //    if (split2 != null) { panel2.m_Split = null; split2.TryDestroy(); }
//        //        //}
//        //        foreach (var key in list) { hash.Remove(key); }

//        //        return hash;
//        //    }
//        //}
//        //protected static void SetGroup(XIDEGroup group, XIDESplitPanel panel)
//        //{
//        //    if (group == null || panel == null) return;

//        //    //查找之前的 XIDESplitPanel
//        //    var hash = HashGroupPanel;
//        //    var panel2 = hash[group];

//        //    hash[group] = panel;
//        //    group.Parent = panel;

//        //    //释放 XIDEGroup 之前的 XIDESplitPanel
//        //    if (panel == panel2 || panel2 == null) return;
//        //    var split2 = panel2.Owner;
//        //    if (split2 != null) { panel2.m_Group = null; split2.TryDestroy(); }
//        //}
//        //protected static void SetSplit(XIDESplitControl split, XIDESplitPanel panel)
//        //{
//        //    if (split == null || panel == null) return;

//        //    //查找之前的 XIDESplitPanel
//        //    var hash = HashSplitPanel;
//        //    var panel2 = hash[split];

//        //    hash[split] = panel;
//        //    split.Parent = panel;

//        //    //释放 XIDESplitControl 之前的 XIDESplitPanel
//        //    if (panel == panel2 || panel2 == null) return;
//        //    var split2 = panel2.Owner;
//        //    if (split2 != null) { panel2.m_Split = null; split2.TryDestroy(); }
//        //}


//        //public static void DisposeGroup(XIDEGroup group)
//        //{
//        //    if (group == null) return;

//        //    //查找 XIDESplitPanel
//        //    var hash = m_HashGroupPanel; //HashGroupPanel
//        //    var panel2 = hash[group];

//        //    //释放 XIDEGroup 对应的 XIDESplitPanel
//        //    var split2 = panel2 == null ? null : panel2.Owner;
//        //    if (split2 != null) { panel2.m_Group = null; split2.TryDestroy(); }
//        //}
//        //public static void DisposeSplit(XIDESplitControl split)
//        //{
//        //    if (split == null) return;

//        //    //查找 XIDESplitPanel
//        //    var hash = m_HashSplitPanel; //HashSplitPanel;
//        //    var panel2 = hash[split];

//        //    //释放 XIDESplitControl 对应的 XIDESplitPanel
//        //    var split2 = panel2 == null ? null : panel2.Owner;
//        //    if (split2 != null) { panel2.m_Split = null; split2.TryDestroy(); }
//        //}

//        #endregion

//    }

//}
